<?php
/**
 * Класс процесс, пока что используется как хранилище для алгоритма сборки XML ответа
 *
 * @package eventsfetcher
 * @author Alexander Sibiryakov
 **/
class Process
{
	/**
	 * Здесь у нас проинициализированный DbStorage
	 *
	 * @var DbStorage
	 **/
	public $dbs;
	public $sm_db;

	public $url_gen;

	/*
	* Тут тип DOMDocument
	* см. расширение DOM PHP5
	*
	*/
	private $dom;
	private $main_node;

	public function __construct(UrlGenThing $ug) {
		$this->url_gen = $ug;
		$this->initXML();
	}

	private function initXML() {
		$this->dom = new DOMDocument('1.0', 'utf-8');
		$events = $this->dom->createElement("root");
		$events->setAttribute("output_encoding", "UTF8");
		$this->main_node = $this->dom->appendChild($events);
	}

	private function getEventHandler($event_type, $content_type) {

		switch($event_type) {
			case "delete_comment":
			case "delete_item":
				return new DeleteEventHandler($this->sm_db, $this->url_gen);

			default:
		}

		switch($content_type) {
			case "fcomment":
				return new CommentEventHandler($this->sm_db, $this->url_gen);
				break;

			case "fdoc":
				return new DocumentEventHandler($this->sm_db, $this->url_gen);
				break;

			case "fimage":
				return new ImageEventHandler($this->sm_db, $this->url_gen);
				break;

			case "flink":
				return new LinkEventHandler($this->sm_db, $this->url_gen);
				break;

			case "ffile":
				return new FileEventHandler($this->sm_db, $this->url_gen);
				break;

			default:
		}
		return null;
	}

	/**
	 * Подготовит данные для рендера в XML, с данными для отправки удаленному серверу
	 *
	 * @return void
	 * @param $limit_count - кол-во сообщений в штуках
	 * @param $cananonical_url - канонический URL openid сервера по которому фильтровать
	 * @param $um1 - нижний период времени, unix mark
	 * @param $um2 - вернхий период времени, unix mark
	 * @author Alexander Sibiryakov
	 **/
	public function getData($um1, $cananonical_url, $limit_count) {
		$events = array();

		/**
		 * ticket #615
		 *
		 * получаем время последней записи из таблицы событий
		 * если найдена запись
		 * 	проверяем не пора ли запускать парсер лога
		 * 	забираем события
		 * иначе
		 * 	забираем события
		 * 	если список пуст, запускаем парсер и забираем события второй раз
		 *
		 */
		$maxEventTime = $this->dbs->getMaxEventTime();
		if ( $maxEventTime > 0 ) {
			require("config.php");

			if ( isset($parse_delay_sec) && $parse_delay_sec > 0
			&& time() - $maxEventTime > $parse_delay_sec ) {
				require_once('cron.php');
			}
			$events = $this->dbs->getEvents($um1, $cananonical_url, $limit_count);
		} else {
			$events = $this->dbs->getEvents($um1, $cananonical_url, $limit_count);

			if ( empty($events) ) {
				require_once('cron.php');
				$events = $this->dbs->getEvents($um1, $cananonical_url, $limit_count);
			}
		}

		$xml = array();

		$this->dom->formatOutput = true;
		if (count($events) > 0)
		foreach ($events as $e) {
			$eh = $this->getEventHandler($e->type, $e->content_type);
			if ($eh) {
				$eh->setEvent($e);
				$eh->fetchData();
				$xml[$e->type][] = $eh->createElements($this->dom); // сюда будут положены созданные элементы через  $dom->createElement()
				unset($eh);
			}
		}

		$messages_elt = $this->dom->createElement("messages");
		$messages_node = $this->main_node->appendChild($messages_elt);

		// собираем структуру из созданных элементов
		foreach ($xml as $type=>$items) {
			foreach ($items as $xml_elements_set) {
				switch($type) {
					case "delete_comment":
					case "delete_item":
						$typ_elt = $this->dom->createElement("message_delete");
						break;

					default:
						$typ_elt = $this->dom->createElement("message");
				}

				$type_node = $messages_node->appendChild($typ_elt);

				foreach ($xml_elements_set as $xml_element) {
					if (!($xml_element instanceof DOMElement)) {
						var_dump($xml_element);
					}
					$type_node->appendChild($xml_element);
				}
			}



		}
	}

	public function setSiteInfo(array $site) {
		$site_el = $this->dom->createElement("site");
		$sn = $this->main_node->appendChild($site_el);

		$email = $this->dom->createElement("admin_email", $site['email']);
		$sn->appendChild($email);

		$uid = $this->dom->createElement("uid", $site['uid']);
		$sn->appendChild($uid);

		$base_url = $this->dom->createElement("root_url", $site['base_url']);
		$sn->appendChild($base_url);

		$site_name = $this->dom->createElement("title", $site['site_name']);
		$sn->appendChild($site_name);
	}

	/**
	 * Вернет XML, если Вы хотите видеть там события перед этим нужно вызвать $this->getData()
	 *
	 * @return string
	 * @author Alexander Sibiryakov
	 **/
	public function getXML() {
		return $this->dom->saveXML();
	}

	/**
	 * Очистить внутренний XML контейнер
	 *
	 * @return void
	 * @author Alexander Sibiryakov
	 **/
	public function cleanUp() {
		$this->initXML();
	}

} // END class
